iT邦幫忙

2021 iThome 鐵人賽

DAY 17
1

試試看 Liveview

我們做一個被做爛的計數器吧呵呵
我們繼續在~H""" """ 裡面加上該呈現的 html,
這個計數器應該是有夠小,我們就寫在這邊就好

  def render(assigns) do
    ~H"""
    我的第n個計數器
    <div>
      <h1>0</h1>
      <button>加一</button>
      <button>減一</button>
      <button>歸零</button>
    </div>
    """
  end

長這樣
https://ithelp.ithome.com.tw/upload/images/20210930/20141054MbXtmUmHzM.png

liveview 這邊跟 GenServer 用法有一點像,我們的狀態是統一的
首先我們會需要做 mount 方法

  def mount(_params, _session, socket) do
    {:ok, assign(socket, :number, 0)}
  end

params 跟 session 我們這邊暫時不會用到,沒有用到的變數,可以在前面加底線代表忽略他
我們在用 assign 把 number 與他的初始值放進 socket 裡面
放完之後我們就可以把 number 綁在我們的頁面上

  def render(assigns) do
    ~H"""
    我的第n個計數器
    <div>
      <h1><%= @number %></h1>
      <button>加一</button>
      <button>減一</button>
      <button>歸零</button>
    </div>
    """
  end

這個時候如果我直接調整 number 的值,並存檔,他也會馬上反映在網頁上
不過我們想要的是按按鈕改變,

  def render(assigns) do
    ~H"""
    我的第n個計數器
    <div>
      <h1><%= @number %></h1>
      <button phx-click="加ㄧ">加一</button>
      <button>減一</button>
      <button>歸零</button>
    </div>
    """
  end

我們馬上來幫加一按鈕綁上動作,我們用 phx-click 在這個按鈕上增加一個方法來接他

  def handle_event("加一", _value, socket) do
    {:noreply, assign(socket, :number, socket.assigns.number + 1)}
  end

就這樣 計數器的數字就會增加了
我們來看看紀錄狀態的 socket 長怎樣

在加一這邊把它印出來好了

  def handle_event("加一", _value, socket) do
    IO.inspect(type(socket))
    {:noreply, assign(socket, :number, socket.assigns.number + 1)}
  end
#Phoenix.LiveView.Socket<
  assigns: %{__changed__: %{}, flash: %{}, live_action: :index, number: 1},
  endpoint: CardWeb.Endpoint,
  id: "phx-FqmhzEUZvexvGAOH",
  parent_pid: nil,
  root_pid: #PID<0.1447.0>,
  router: CardWeb.Router,
  transport_pid: #PID<0.1441.0>,
  view: CardWeb.PageLive.Index,
  ...

可以看到這個跟我們之前一直在操作的 Game 有點像,
只是我們會動到的東西大部分都在 assigns 裡面,
他也提供我們 assign 方法可以直接放東西進去。

來做好其他按鈕吧!

  def render(assigns) do
    ~H"""
    我的第n個計數器
    <div>
      <h1><%= @number %></h1>
      <button phx-click="加一">加一</button>
      <button phx-click="減一">減一</button>
      <button phx-click="歸零">歸零</button>
    </div>
    """
  end
  def handle_event("減一", _value, socket) do
    {:noreply, assign(socket, :number, socket.assigns.number - 1)}
  end

  def handle_event("歸零", _value, socket) do
    {:noreply, assign(socket, :number, 0)}
  end

成果 gif
https://ppt.cc/fCJfux@.gif

沒花什麼功夫就弄好了。

在開始真的把遊戲裝上去之前,明天先來把 Tailwind css 裝好吧。


上一篇
16 安裝 Phoenix,產出新專案
下一篇
18 在 Phoenix 1.6 安裝 tailwindcss
系列文
連線網頁卡牌遊戲(Elixir, Phoenix, Liveview)32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言